package red.stu.pconstraint;

import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import red.stu.pconstraint.annotation.ProcessTimerNode;
import red.stu.pconstraint.pojo.ProcessStorage;

/**
 * 处理单元
 *
 * @author yihrmc@stu.red
 * @date 2019/11/13 16:50
 */
public interface ProcessUnit {

    /**
     * 获取当前流程实例ID
     * @return
     */
    ProcessStorage getProcessData();

    /**
     * 到下一个接口 <br/>
     *      - 切换成功后，将不可继续在方法内执行任何切换方法
     */
    void next();

    /**
     * 根据状态切换到分支
     * @param stateName 状态名
     */
    void changeBranch(@NotNull String stateName);

    /**
     * 手动终止流程
     * @param state 终止状态
     */
    void close(@NotNull Short state);

    /**
     * 手动终止流程
     * @param state 终止状态
     * @param closeName 终止类型名
     */
    void close(@NotNull Short state, @Nullable String closeName);

    /**
     * 启动指定的定时任务节点
     *      - 定时任务需要通过@ProcessTimerNode注解声明
     * @param timerName 任务名
     * @param outTime 延迟执行时间
     * @see ProcessTimerNode
     */
    void doTimer(@NotNull String timerName, long outTime);

    /**
     * 启动指定的定时任务节点
     *      - 定时任务需要通过@ProcessTimerNode注解声明
     * @param timerName 任务名
     * @param outTime 延迟执行时间
     * @param autoClear 是否节点被切换后自动取消任务
     * @see ProcessTimerNode
     */
    void doTimer(@NotNull String timerName, long outTime, boolean autoClear);

    /**
     * 取消指定定时任务节点执行
     * @param timerName 任务名
     */
    void clearTimer(@NotNull String timerName);

}
